{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###第三周作业\n",
    "在 Rental Listing Inquiries 数据上练习 xgboost 参数调优\n",
    "数据说明：\n",
    "Rental Listing Inquiries 数据集是 Kaggle 平台上的一个分类竞赛任务，需要根据\n",
    "公寓的特征来预测其受欢迎程度（用户感兴趣程度分为高、中、低三类）。其\n",
    "中房屋的特征 x 共有 14 维，响应值 y 为用户对该公寓的感兴趣程度。评价标准\n",
    "为 logloss。\n",
    "数据链接：https://www.kaggle.com/c/two-sigma-connect-rental-listing-inquiries\n",
    "为减轻大家对特征工程的入手难度，以及统一标准，数据请用课程网站提供的\n",
    "特征工程编码后的数据（RentListingInquries_FE_train.csv）或稀疏编码的形式\n",
    "（RentListingInquries_FE_train.bin）。xgboost 既可以单独调用，也可以在\n",
    "sklearn 框架下调用。大家可以随意选择。若采用 xgboost 单独调用使用方式，\n",
    "建议读取稀疏格式文件。\n",
    "关于特征工程的过程，可参看文件：FE_RentListingInqueries.ipynb\n",
    "作业要求：\n",
    "采用 xgboost 模型完成商品分类（需进行参数调优）。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "from xgboost import XGBClassifier # scikit-learn嵌入的\n",
    "import xgboost as xgb             #用xgboost，交叉验证做迭代次数\n",
    "\n",
    "import numpy  as np #线性代数等\n",
    "import pandas as pd #读取文件等\n",
    "import scipy  as sp #处理10^10级别的数等\n",
    "import seaborn           as sns       #画图      \n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from matplotlib import pyplot\n",
    "from sklearn.model_selection import GridSearchCV  #网格搜索加交叉验证\n",
    "from sklearn.model_selection import StratifiedKFold #缺省的交叉验证用\n",
    "\n",
    "from sklearn.metrics import log_loss #评价指标"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "#读取数据\n",
    "trainRental = pd.read_csv(\"RentListingInquries_FE_train.csv\")\n",
    "testRental  = pd.read_csv(\"RentListingInquries_FE_test.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "#trainRental.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "#trainRental.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "#testRental.head()#观察之后发现trainRental和testRental差异在于　一维　响应值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "#testRental.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "#sns.countplot(trainRental.interest_level)#查看响应值分布，两两之间都相差不到10倍，还可以"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "#划分输入特征和响应\n",
    "X_train = trainRental.drop(\"interest_level\",axis = 1)\n",
    "y_train = trainRental[\"interest_level\"]\n",
    "#y_train.head()\n",
    "cols = X_train.columns\n",
    "#print(cols)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "#已经是特征编码后的数据\n",
    "#StratifiedKFold 分层采样交叉切分，确保训练集，测试集中各类别样本的比例与原始数据集中相同。\n",
    "RentalKFold = StratifiedKFold(n_splits = 4,shuffle = True,random_state = 3)\n",
    "#待观察模型是过拟合还是欠拟合"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "第一轮调整得到的迭代次数为383"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'max_depth': [4, 5, 6], 'min_child_weight': [4, 5, 6]}\n"
     ]
    }
   ],
   "source": [
    "#依据建议来设置参数\n",
    "max_depth = [4,5,6]\n",
    "min_child_weight =[4,5,6]\n",
    "param_test_3 = dict(max_depth = max_depth,min_child_weight = min_child_weight)\n",
    "print(param_test_3)#构造网格"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "xgbSecond = XGBClassifier(                               #三步曲第一步\n",
    "                        learning_rate = 0.1,\n",
    "                        n_estimators = 383,    #首次变更项\n",
    "                        max_depth = 4,      \n",
    "                        min_child_weight = 1,   #同一考虑\n",
    "                        gamma = 0,\n",
    "                        subsample = 0.3,\n",
    "                        colsample_bytree = 0.8,\n",
    "                        colsample_bylevel = 0.7,#行列采样\n",
    "                        objective = \"multi:softprob\",                                       #因为是多类分问题\n",
    "                        seed = 3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "#GSearch_2 = GridSearchCV(xgbSecond,param_grid = param_test_2，scoring = \"neg_log_loss\",n_jobs = -1,cv = RentalKFold )\n",
    "GSearch_3 = GridSearchCV(xgbSecond, param_grid = param_test_3, scoring='neg_log_loss',n_jobs= -1, cv=RentalKFold)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=StratifiedKFold(n_splits=4, random_state=3, shuffle=True),\n",
       "       error_score='raise',\n",
       "       estimator=XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=0.7,\n",
       "       colsample_bytree=0.8, gamma=0, learning_rate=0.1, max_delta_step=0,\n",
       "       max_depth=4, min_child_weight=1, missing=None, n_estimators=383,\n",
       "       n_jobs=1, nthread=None, objective='multi:softprob', random_state=0,\n",
       "       reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=3, silent=True,\n",
       "       subsample=0.3),\n",
       "       fit_params=None, iid=True, n_jobs=-1,\n",
       "       param_grid={'max_depth': [4, 5, 6], 'min_child_weight': [4, 5, 6]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "GSearch_3.fit(X_train , y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Dell\\Documents\\anaconda\\lib\\site-packages\\sklearn\\model_selection\\_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([mean: -0.59094, std: 0.00460, params: {'max_depth': 4, 'min_child_weight': 4},\n",
       "  mean: -0.59028, std: 0.00508, params: {'max_depth': 4, 'min_child_weight': 5},\n",
       "  mean: -0.59029, std: 0.00463, params: {'max_depth': 4, 'min_child_weight': 6},\n",
       "  mean: -0.58968, std: 0.00587, params: {'max_depth': 5, 'min_child_weight': 4},\n",
       "  mean: -0.58907, std: 0.00497, params: {'max_depth': 5, 'min_child_weight': 5},\n",
       "  mean: -0.58984, std: 0.00557, params: {'max_depth': 5, 'min_child_weight': 6},\n",
       "  mean: -0.59186, std: 0.00382, params: {'max_depth': 6, 'min_child_weight': 4},\n",
       "  mean: -0.59232, std: 0.00526, params: {'max_depth': 6, 'min_child_weight': 5},\n",
       "  mean: -0.59257, std: 0.00551, params: {'max_depth': 6, 'min_child_weight': 6}],\n",
       " {'max_depth': 5, 'min_child_weight': 5},\n",
       " -0.5890653738428216)"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "GSearch_3.grid_scores_, GSearch_3.best_params_,     GSearch_3.best_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Dell\\Documents\\anaconda\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\Dell\\Documents\\anaconda\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\Dell\\Documents\\anaconda\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\Dell\\Documents\\anaconda\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\Dell\\Documents\\anaconda\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\Dell\\Documents\\anaconda\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([224.75016093, 237.67422742, 222.07951045, 271.20439124,\n",
       "        274.4460302 , 276.00351256, 345.65549147, 324.46111995,\n",
       "        318.07777148]),\n",
       " 'mean_score_time': array([1.28917789, 1.28817588, 1.24105096, 2.79518288, 2.57973486,\n",
       "        3.19825476, 4.53255284, 4.42150688, 3.8082512 ]),\n",
       " 'mean_test_score': array([-0.59093938, -0.59027583, -0.59029041, -0.58968351, -0.58906537,\n",
       "        -0.58984202, -0.59186318, -0.59232397, -0.59257366]),\n",
       " 'mean_train_score': array([-0.52078841, -0.52194541, -0.52320213, -0.47492245, -0.47752031,\n",
       "        -0.48029275, -0.42078047, -0.42620455, -0.43031731]),\n",
       " 'param_max_depth': masked_array(data=[4, 4, 4, 5, 5, 5, 6, 6, 6],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'param_min_child_weight': masked_array(data=[4, 5, 6, 4, 5, 6, 4, 5, 6],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'params': [{'max_depth': 4, 'min_child_weight': 4},\n",
       "  {'max_depth': 4, 'min_child_weight': 5},\n",
       "  {'max_depth': 4, 'min_child_weight': 6},\n",
       "  {'max_depth': 5, 'min_child_weight': 4},\n",
       "  {'max_depth': 5, 'min_child_weight': 5},\n",
       "  {'max_depth': 5, 'min_child_weight': 6},\n",
       "  {'max_depth': 6, 'min_child_weight': 4},\n",
       "  {'max_depth': 6, 'min_child_weight': 5},\n",
       "  {'max_depth': 6, 'min_child_weight': 6}],\n",
       " 'rank_test_score': array([6, 4, 5, 2, 1, 3, 7, 8, 9]),\n",
       " 'split0_test_score': array([-0.58389066, -0.58238582, -0.58281848, -0.58013542, -0.58084282,\n",
       "        -0.58090934, -0.58642327, -0.58393573, -0.58384731]),\n",
       " 'split0_train_score': array([-0.52262892, -0.52384031, -0.5246969 , -0.47687693, -0.48028504,\n",
       "        -0.48301695, -0.4227946 , -0.42945739, -0.43310156]),\n",
       " 'split1_test_score': array([-0.59083575, -0.59280622, -0.59105999, -0.59151488, -0.59109635,\n",
       "        -0.59116136, -0.59302116, -0.59426244, -0.5960868 ]),\n",
       " 'split1_train_score': array([-0.51963582, -0.52106298, -0.52237408, -0.47269038, -0.47661754,\n",
       "        -0.47862046, -0.41947627, -0.42375875, -0.42917784]),\n",
       " 'split2_test_score': array([-0.59236415, -0.58978992, -0.59177312, -0.59092565, -0.59015817,\n",
       "        -0.59105247, -0.59098934, -0.59275675, -0.59205342]),\n",
       " 'split2_train_score': array([-0.52132374, -0.5224966 , -0.52368433, -0.47459612, -0.47666763,\n",
       "        -0.4801885 , -0.42213988, -0.42719384, -0.43170362]),\n",
       " 'split3_test_score': array([-0.596668  , -0.59612248, -0.59551107, -0.59615938, -0.59416523,\n",
       "        -0.59624617, -0.59701981, -0.59834211, -0.59830828]),\n",
       " 'split3_train_score': array([-0.51956517, -0.52038176, -0.52205321, -0.47552637, -0.47651104,\n",
       "        -0.47934511, -0.41871116, -0.42440823, -0.42728623]),\n",
       " 'std_fit_time': array([0.95457571, 0.35129281, 0.32001415, 0.65493169, 0.57965289,\n",
       "        0.47332191, 0.98572434, 0.52088466, 0.45616215]),\n",
       " 'std_score_time': array([0.04194532, 0.07609254, 0.05370425, 0.61381543, 0.84435838,\n",
       "        1.55625208, 1.0912752 , 1.25583889, 0.44870868]),\n",
       " 'std_test_score': array([0.00459738, 0.00507634, 0.00463352, 0.00587375, 0.00497346,\n",
       "        0.0055681 , 0.00381734, 0.00525663, 0.00551478]),\n",
       " 'std_train_score': array([0.00127464, 0.00133399, 0.00105742, 0.0015226 , 0.00159722,\n",
       "        0.00166784, 0.00172393, 0.00227861, 0.00224498])}"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "GSearch_3.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best: -0.589065 using {'max_depth': 5, 'min_child_weight': 5}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Dell\\Documents\\anaconda\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\Dell\\Documents\\anaconda\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\Dell\\Documents\\anaconda\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\Dell\\Documents\\anaconda\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\Dell\\Documents\\anaconda\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\Dell\\Documents\\anaconda\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZgAAAELCAYAAADkyZC4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3Xl8VeW18PHfSshAQkIm5iQkJCigpCARECuCFsWhKNVbh+ItvrXYWq6296213vbW69AW632ttlpba7W2daDSatHSGrAqVmUICKhYJQxCQBkSCGNChvX+8exzcnKSkIHsnAzr+/mcD2fPzz4kZ+UZ9npEVTHGGGM6WlSkC2CMMaZnsgBjjDHGFxZgjDHG+MICjDHGGF9YgDHGGOMLCzDGGGN8YQHGGGOMLyzAGGOM8YUFGGOMMb7oE+kCRFJGRobm5OREuhjGGNOtrFmzZp+qDmhpv14dYHJyciguLo50MYwxplsRkY9bs581kRljjPGFBRhjjDG+sABjjDHGFxZgjDHG+MICjDHGGF9YgDHGGOMLCzDGGGN80aufgzHGmN6guraassoy9h3bR9kx929eSh7jBo7z9boWYIwxphuqqathf+X+YOAIDR5lx8oarD94/GCj4/99zL937wAjIjOBB4Fo4DFVXRC2fS5wH7DTW/WQqj7mbbsXuMRbf7eqLvTWPwUUAtXAKuBGVa0WkWnAX4Ct3jF/VtW7fLo1Y4zpcHVaR0VVRX3AqCxrEDT2HdvHvkr3fn/lfhRtdI6EPglk9M0go28GeSl5TBw8kYy+GaT3TQ+uT49PJ71vuu/341uAEZFo4GFgBlAKrBaRxaq6MWzXhao6P+zYS4AzgHFAHPC6iPxNVQ8CTwFzvF2fBm4AHvGW31DVS325IWOMaQdV5VD1ofqaRSBghNU8ArWOWq1tdI646LhgYMjsl8m4AeNcwIjPCAaP9L7ppMenkxCTEIG7bJqfNZiJQImqbgEQkWeBy4DwANOUMcDrqloD1IjIemAm8EdVXRLYSURWAZkdXnJjjGnB0eqjTQaK8CaqsmNlHK873uj4PtInGBgGJAxgVNqoBsEiNHj0i+mHiETgLk+OnwFmGLAjZLkUmNTEfleIyFTgI+BbqroDWA/cISL3AwnAdMICk4jEANcBt4SsPssLRruAb6vq++EXE5F5wDyA7Ozsdt6aMaYnqqqtqm+KCgkeoTWPwPpjNccaHR8lUaTGpQabonL75waDRXgTVXJcMlHSswfy+hlgmgq34Q2GLwLPqGqViHwNeBI4T1WLRORM4C1gL/A2UBN27C+A5ar6hre8FhiuqodF5GLgBWBkowKoPgo8ClBYWNi4AdMY06NU11VTfqw82HdxoiaqQ9WHmjxHSlxKMDAUDCho2KcRX1/rSI1LJToqupPvsOvyM8CUAlkhy5m4mkWQqpaFLP4auDdk2w+BHwKIyNPApsA2EbkDGADcGLL/wZD3S0TkFyKSoar7OuRujDFdRm1dLfur9tcHjMp9jWoYgeUDVQeaPEdSTFIwMJyadirp8SE1jJBmqrT4NGKiYzr5DnsGPwPMamCkiOTiRoldDVwbuoOIDFHVT7zFWcAH3vpoIEVVy0SkACgAirxtNwAXAueral3IuQYDu1VVRWQi7iHS0ABmjOnCVJWKqorGfRqVjZuo9lftp67+1z+ob5++wUAxPHk4EwZNCHZ+Nwge8enE94mPwF32Lr4FGFWtEZH5wMu4YcqPq+r7InIXUKyqi4GbRWQWrvmrHJjrHR4DvOF1ah0E5ngd/gC/BD4G3va2B4YjXwl8XURqgGPA1apqTWDGRJCqcqT6SNN9GuFNVJVl1NSFt4RDTFRMsHlqSOIQTs84vVF/RuB9VxpBZUB683dwYWGh2oyWxrTdsZpjJx52G9JEVVVb1ej4aIkmLT6tQY0itIYRuj45NrlbjqDqyURkjaoWtrSfPclvjAHgeO1xyivLGw25bfTAX2UZR6qPNDpeEFLjU4OBIXtgdoOH+kKDR0pcSo8fQWUswBjTowXSiTQ3aiq0c7ypdCIAybHJweBwWvpp9R3gYU1UqfGp9ImyrxRTz34ajOlm6rSOA1UHTph7KlDjaC6dSGJMYjAwhKYTCU8pkhafRmx0bATu0vQEFmCM6UKqa6vZdnAbWyq2sPfo3iabqMory0+cTqRvfTqR0BpGV00nYnouCzDGREBtXS07Du2g5EBJ8LX5wGa2VWyjRutHUoWnExmdPrphn0ZI53hiTKJ1hpsuxQKMMT6q0zo+OfIJJftLGgSTrRVbG4yuyuyXSX5qPtOyppGfkk9eSh6DEwb3inQipueyAGNMB1BV9h7b6wLI/oa1kqM1R4P7DUoYRH5qPpMGTyI/NZ+RKSPJ7Z9rTVamR7IAY0wb7a/cX18bCQkmoaOw0uLTGJkyksvzLw8GkhEpI0iOTY5gyY3pXBZgjGnG4eOHGzRrBQJKWWV9BqKk2CRGpozkwpwLyU/JZ2TqSPJS8kiLT4tgyY3pGizAmF7vWM0xtlRsadRP8umRT4P79O3Tl7z+eZyTeY4LJCkukAxMGGgd68Y0wwKM6TWO1x5n28FtjQJJ6aHS4LMisVGx5PbPZcKgCeSn5AdfQ/sNtc52Y9rIAozpcWrqauqHAIcEk48Pfhx8fiRaohmePJzRaaP5fN7ng4EkKynLnkY3poPYb5Lptuq0jl2HdzXqI9lasTU4Ra0gZCZlkp+Sz/nZ57tAkppPTnKOPaFujM8swJguT1XZc3RPo0CyuWJzg2lrBycOJj8lnylDp5CXkkd+aj4j+o+gb5++ESy9Mb2XBRjTpZRXljfqIyk5UMKh4/VT2abHp5Ofms8XRn4h2LSVl5JHUmxSBEtujAlnAcZExMHjB9l8YHOjfpLyyvLgPsmxyeSn5HNRzkXkp9Z3uKfGp0aw5MaY1rIAY3x1tPqoGwIcFkh2H90d3CehTwL5Kfmcm3lusI8kPyWfAX0H2BBgY7oxCzCmQxyvPc7Wiq2NnnDfeXhngyHAeSl5nDn4zAYPJQ5JHGJDgI3pgSzAmDapqath+8HtjfpIth/cHhwC3Ef6kNM/h9MyTuOy/MuCDyVmJWURHRUd4TswxnQWXwOMiMwEHgSigcdUdUHY9rnAfcBOb9VDqvqYt+1e4BJv/d2qutBb/xRQCFQDq4AbVbVaXFvKg8DFwFFgrqqu9fH2erQ6rWPnoZ3BALLpwCY2H9jM1oqtVNdVA24IcHZyNnn985gxfEawjyQnOYeY6JgI34ExJtJ8CzAiEg08DMwASoHVIrJYVTeG7bpQVeeHHXsJcAYwDogDXheRv6nqQeApYI6369PADcAjwEXASO81yVs3yY9760lUld1HdwebtQKBZEvFlgZDgIckDiE/JZ+zh50dDCS5/XNtCLAxpll+1mAmAiWqugVARJ4FLgPCA0xTxgCvq2oNUCMi64GZwB9VdUlgJxFZBWR6i5cBv1NVBVaISIqIDFHVTzrulrq3smNljZ4lKTlQwuHqw8F9MvpmkJ+SzxUjrwh2uOf1z6NfbL8IltwY0x35GWCGATtClktpukZxhYhMBT4CvqWqO4D1wB0icj+QAEwnLDCJSAxwHXDLCa43DOh1AaaiqiI4BHjT/k1srthMyf4S9lftD+7TP64/+Sn5XDLikgY5t1LiUyJYcmNMT+JngGlqfKmGLb8IPKOqVSLyNeBJ4DxVLRKRM4G3gL3A20BN2LG/AJar6httuB4iMg+YB5Cdnd3ae+mSjlYfrX+WJKRWsufYnuA+CX0SyE/N57zs89zT7d7orfT4dBsCbIzxlZ8BphTIClnOBHaF7qCqZSGLvwbuDdn2Q+CHACLyNLApsE1E7gAGADe25XreeR8FHgUoLCxsFIC6oqraKrZWbHW1kZCAsvPwzuA+cdFxjOg/gslDJ9cHkpSRDE4cbIHEGBMRfgaY1cBIEcnFjRK7Grg2dIewPpJZwAfe+mggRVXLRKQAKACKvG03ABcC56tqXcjpFgPzvb6eSUBFd+t/qa6rZvvB7cGO9kAfyfZD26nzbjUwBLggo4DZ+bODDyVm9su0IcDGmC7FtwCjqjUiMh94GTdM+XFVfV9E7gKKVXUxcLOIzMI1f5UDc73DY4A3vL+8DwJzvA5/gF8CHwNve9v/rKp3AUtwQ5RLcMOUr/fr3k5WbV0tOw/vbBBINh3YxLaD26ipc7cZJVFkJ2WTl5LnZkv0pt3NTs4mJsqGABtjuj5xg656p8LCQi0uLvbt/KrKp0c+rQ8kXqf71oqtVNZWBvcb1m9YsFkrdAhwfJ9438pmjDHtJSJrVLWwpf3sSf4OoKqUVZY16CMJBJUj1UeC+w3sO5C8lDz+7dR/Cz7dnpeSR2JMYgRLb4wx/rAA0w47D+/kn6X/bFAzOVB1ILg9JS6F/JR8Pj/i88F8W/kp+fSP6x/BUhtjTOeyANMOG8s2cs/Ke0iMSWw0U2J+Sr4NATbGGCzAtMuUoVNYeuVSBiUMskBijDHNsADTDokxidZvYowxLbBJOIwxxvjCAowxxhhfWIAxxhjjCwswxhhjfGEBxhhjjC8swBhjjPGFBRhjjDG+sABjjDHGFxZgjDHG+MICjDHGGF9YgDHGGOMLCzDGGGN8YQHGGGOMLyzAGGOM8YWvAUZEZorIhyJSIiLfbWL7XBHZKyLrvNcNIdvuFZH3vNdVIevne+dTEckIWT9NRCpCzvUDP+/NGGPMifk2H4yIRAMPAzOAUmC1iCxW1Y1huy5U1flhx14CnAGMA+KA10Xkb6p6EHgTeAl4rYnLvqGql3bsnRhjjGkPP2swE4ESVd2iqseBZ4HLWnnsGOB1Va1R1SPAemAmgKq+o6rb/CiwMcaYjuNngBkG7AhZLvXWhbtCRDaIyCIRyfLWrQcuEpEErxlsOpDVxLHhzhKR9SLyNxE57aRKb4wx5qT4GWCamqxew5ZfBHJUtQBYBjwJoKpFwBLgLeAZ4G2gpoXrrQWGq+pngJ8DLzRZKJF5IlIsIsV79+5t7b0YY4xpIz8DTCkNax2ZwK7QHVS1TFWrvMVfAxNCtv1QVcep6gxcsNp0ooup6kFVPey9XwLEhA4CCNnvUVUtVNXCAQMGtOe+jDHGtIKfAWY1MFJEckUkFrgaWBy6g4gMCVmcBXzgrY8WkXTvfQFQABSd6GIiMlhExHs/EXdvZR10L8YYY9rIt1FkqlojIvOBl4Fo4HFVfV9E7gKKVXUxcLOIzMI1f5UDc73DY4A3vHhxEJijqjUAInIz8B1gMLBBRJao6g3AlcDXRaQGOAZcrarhTXLGGGM6ifTm7+DCwkItLi6OdDGMMaZbEZE1qlrY0n72JL8xxhhfWIAxxhjjCwswxhhjfGEBxhhjjC8swBhjjPGFBRhjjDG+sABjjDHGFxZgjDHG+MK3J/mNMT1PdXU1paWlVFZWRroophPEx8eTmZlJTExMu463AGOMabXS0lKSkpLIycnBS+VkeihVpaysjNLSUnJzc9t1DmsiM8a0WmVlJenp6RZcegERIT09/aRqq20KMCISJSLJ7b6aMabbs+DSe5zs/3WLAUZEnhaRZBFJBDYCH4rIrSd1VWOMMT1ea2owY1T1IHA5bpbJbOA6X0tljDFNOHDgAL/4xS/adewDDzzA0aNHO7hEHWPatGm0N7P7Cy+8wMaNG9t1rtraWsaPH8+ll17armu3pDUBJkZEYnAB5i+qWk3jqY+NMcZ3PTXAnIzwANMWDz74IKNHj+7gEtVrzSiyXwHbgPXAchEZjpsEzBjTi9354vts3NWxXwVjhiZzx+dPa3b7d7/7XTZv3sy4ceOYMWMGAwcO5I9//CNVVVXMnj2bO++8kyNHjvDFL36R0tJSamtr+e///m92797Nrl27mD59OhkZGbz66qtNnr9fv3584xvfYNmyZaSmpvKjH/2I73znO2zfvp0HHniAWbNmsW3bNq677jqOHDkCwEMPPcSUKVN4/vnnefjhh1m6dCmffvop5557LsuXL2fw4MGNrnPs2DGuv/56Nm7cyOjRozl27FhwW1FREXfccQdVVVXk5eXxxBNP0K9fP3JycrjqqquCZX/66afZs2cPixcv5vXXX+eee+7hT3/6EwDPPfccN910EwcOHOA3v/kN55xzTqMylJaW8te//pXvfe973H///a3/T2qDFmswqvozVR2mqher8zEw3ZfSGGPMCSxYsIC8vDzWrVvHjBkz2LRpE6tWrWLdunWsWbOG5cuX8/e//52hQ4eyfv163nvvPWbOnMnNN9/M0KFDefXVV5sNLgBHjhxh2rRprFmzhqSkJL7//e+zdOlSnn/+eX7wgx8AMHDgQJYuXcratWtZuHAhN998MwCzZ89m8ODBPPzww3z1q1/lzjvvbDK4ADzyyCMkJCSwYcMGvve977FmzRoA9u3bxz333MOyZctYu3YthYWFDb78k5OTWbVqFfPnz+eb3/wmU6ZMYdasWdx3332sW7eOvLw8AGpqali1ahUPPPAAd955JwC7du3i4osvDp7rm9/8Jj/5yU+IivJvMHGLNRgRuQV4AjgEPAaMB74LFPlWKmNMl3eimkZnKCoqoqioiPHjxwNw+PBhNm3axDnnnMO3v/1tbrvtNi699NIm/3pvTmxsLDNnzgRg7NixxMXFERMTw9ixY9m2bRvgHjadP38+69atIzo6mo8++ih4/M9//nNOP/10Jk+ezDXXXNPsdZYvXx4MTAUFBRQUFACwYsUKNm7cyNlnnw3A8ePHOeuss4LHBc55zTXX8K1vfavZ83/hC18AYMKECcFyDx06lCVLlgDw0ksvMXDgQCZMmMBrr73W2o+nzVrTRPZ/VPVBEbkQGABcjws4FmCMMRGjqtx+++3ceOONjbatWbOGJUuWcPvtt3PBBRcEax8tiYmJCQ7NjYqKIi4uLvi+pqYGgJ/+9KcMGjSI9evXU1dXR3x8fPD4nTt3EhUVxe7du6mrqzth7aCpIcCqyowZM3jmmWdaPOZEQ4gD5Y6Ojg6WO9Sbb77J4sWLWbJkCZWVlRw8eJA5c+bwhz/8odlztkdr6kaBu7gYeEJV14esO/GBIjNF5EMRKRGR7zaxfa6I7BWRdd7rhpBt94rIe97rqpD1873zqYhkhKwXEfmZt22DiJzRmjIaY7qPpKQkDh06BMCFF17I448/zuHDhwH35b5nzx527dpFQkICc+bM4dvf/jZr165tdOzJqKioYMiQIURFRfH73/+e2tpawDVLXX/99Tz99NOMHj36hP0aU6dO5amnngLgvffeY8OGDQBMnjyZN998k5KSEgCOHj3aoIa0cOHC4L+Bmk177uvHP/4xpaWlbNu2jWeffZbzzjuvw4MLtK4Gs0ZEioBc4HYRSQLqWjpIRKKBh4EZQCmwWkQWq2r4cIeFqjo/7NhLgDOAcUAc8LqI/M0bLv0m8BLwWth5LgJGeq9JwCPev8aYHiI9PZ2zzz6b008/nYsuuohrr702+EXbr18//vCHP1BSUsKtt95KVFQUMTExPPLIIwDMmzePiy66iCFDhpywH6YlN910E1dccQXPPfcc06dPJzExEYAf/ehHnHPOOZxzzjmMGzeOM888k0suuaTJUVpf//rXuf766ykoKGDcuHFMnDgRgAEDBvDb3/6Wa665hqqqKgDuueceTjnlFACqqqqYNGkSdXV1wVrO1VdfzVe/+lV+9rOfsWjRombLvWvXLm644YZgM1lnENUTjzgWkSjcF/0WVT0gIunAMFXd0MJxZwH/o6oXesu3A6jqj0P2mQsUNhFgbgXiVPUeb/k3wMuq+seQfbZ5x+7zln8FvKaqz3jLHwLTVPWT5spYWFio7R17bkxv9MEHH/g6rNU0Lycnh+LiYjIyMlreuQM19X8uImtUtbClY1sziqwOyAS+LyL/C0xpKbh4hgE7QpZLvXXhrvCatBaJSJa3bj1wkYgkeM1g04GsJo5tz/WMMcZ0gtaMIlsAnAk85a26WUSmqOrtLR3axLrw6tKLwDOqWiUiXwOeBM5T1SIRORN4C9gLvA007qlq+/UQkXnAPIDs7OwWTmmM6YkmTZoUbIIK+P3vf8/YsWM79Dovv/wyt912W4N1ubm5PP/8820+V2A0WHfSmj6Yi4FxXk0GEXkSeAdoKcCU0rDWkQnsCt1BVctCFn8N3Buy7YfAD71rPg1sOtnreed9FHgUXBNZC+c0xvRAK1eu7JTrXHjhhVx44YWdcq2uqLVP2KSEvO/fymNWAyNFJFdEYoGrgcWhO4jIkJDFWcAH3vpor68HESkACmh5WPRi4N+90WSTgYoT9b+cjD2HKnlpwy72HqpqeWdjjOmlWlOD+THwjoi8imuGmkrLtRdUtUZE5gMvA9HA46r6vojcBRSr6mJcc9ssXPNXOTDXOzwGeMMb530QmKOqNQAicjPwHWAwsEFElqjqDbhEnBcDJcBR3PM6vnj9w73cush1Q40YkMik3HQmj0hjUm46g/vHt3C0Mcb0Di2OIoNgTeNMXIBZCUSpaqPmp+6mvaPIamrreG/XQVZuKWPl1nJWby3nUJXrIspOS2BSbhqTRqQzKTeNrLSEji62MRFjo8h6n5MZRdaqKZO9pqZg85aIbMel7e+V+kRHMS4rhXFZKdx4bh61dcoHnxxkhRdwln6wm+fWlAIwLKWvF3BcDWd4eoJN2GSM6RVaFWCaYN+QIaKjhNOH9ef0Yf254ZwR1NUpH+05xMot5azcWsbrH+3lz+/sBGBQchwTc13tZvKINPIG9LOAY0wrHThwgKeffpqbbrqpzcc+8MADzJs3j4SErteqMG3aNP73f/+XwsIWKwWNvPDCC5xyyimMGTOmTefKyckhKSmJ6Oho+vTp0+75aE6kvQHGRl+dQFSUMGpwMqMGJ/PlKTmoKpv3HmbFlnJWbi1n5ZYyXlzvWhgz+sUyMdfVbiaNSOOUgUlERVnAMaYpgflg2htg5syZ0yUDzMl44YUXuPTSS4MBpi1effVVXx/cbDbAiMjPaTqQCA1HlZkWiAj5A5PIH5jEnMnDUVW2lR1l1dYyr5ZTzpJ3PwUgJSGGiTn1fTijhyQTbQHHdEV/+y58+m7HnnPwWLhoQbObbT6YjpsPpjOcqAZzovqS5Vc5CSJCbkYiuRmJXHWm68raUX40WLtZubWcoo27AUiK78OZOWnBgQOnD02mT7R/8zcY05UtWLCA9957j3Xr1lFUVMSiRYtYtWoVqsqsWbNYvnw5e/fuZejQofz1r38FXHLK/v37c//997f4F3tgPph7772X2bNnB+eD2bhxI1/+8peZNWtWcD6Y+Ph4Nm3axDXXXENxcTGzZ8/mT3/6Ew8//DB///vfWz0fzIYNGzjjDJebN3Q+mMTERO69917uv//+YDbowHwwv/vd7/jmN7/JSy+9xKxZs7j00ku58sorg+cPzAezZMkS7rzzTpYtW9YoF5mIcMEFFyAi3HjjjcybN69D/o9CNRtgVPXJDr+aaVZWWgJZaQlcOSETgE8qjgVrNyu3lvGPf+0BIDE2mglewJk8Io2xw1KI7WMBx0TACWoancHmg2n/fDDgUvYPHTqUPXv2MGPGDEaNGsXUqVNb9Tm1Vnv7YIzPhvTvy+Xjh3H5eJdObc+hSlZtLQ8OHLjv5Q8BiI+J4ozs1GAfzrisFOJjoiNZdGM6hc0H0/75YMAFHHAzdM6ePZtVq1Z1eICxP327iYFJ8VxaMJS7Lz+dom+dy5rvf45fzjmDq8/MZv/Rah545SOufnQFBXcW8cVfvc39RR/yZsk+jh2vjXTRjekwNh9Mx8wHc+TIkeAxR44coaioiNNPP71N52gNq8F0U+n94ph5+hBmnu6y7VQcrWb1Nle7Wbm1nIdeLeFn/yghJlooyEzxRqqlUZiTRr84+2833ZPNB9Mx88Hs3r2b2bNnAy4wXnvttcGmwY7UmvlgftbE6gpcupe/dHiJOlFPng/mUGU1xR/vDzapvVtaQU2dumd2hiYHR6kV5qTRv29MpItrugl7kj9yuuN8MK35UzYeGAU85y1fAbwPfEVEpqvqN9tYXtMJkuJjmH7qQKafOhCAo8drWPvxAVfD2VLOb9/cxqPLtyACY4YkMyk3PVjLSU2MjXDpjTE9QWsCTD5ujpZAsslHcJmNZwAdPAje+CUhtg+fHZnBZ0e6v34qq2t5Z3t9wHlq5cc8/uZWAE4dlBRMbTMxN40BSXGRLLoxHc7mg+kcrQkww4BEXLMY3vuhqlorIpavvpuKj4nmrLx0zspLB6CqppYNpRXB53AWrSnld29/DEDegMRgk9rkEekMSraM0aZ7s/lgOkdrAsxPgHUi8hr16fp/JCKJwDIfy2Y6UVyfaM7MSePMnDTmA9W1dby3s6I+tc26XTy9cjsAw9O9jNHe0OjM1J6VesMY0zFaDDCq+hsRWQJMxAWY/wpJ1X+rn4UzkRMTHcX47FTGZ6fyNS9j9MZdB1m5tYwVW8p5+f3d/LE4JGP0iDQmewEnO80yRhtjWj9M+Uwg8DhsLU1MRWx6tugoYWxmf8Zm1meM/nD3oWCT2usf7uXPa13G6MHJ8Q36cPIGJFrAMaYXajHAiMgCXIB5ylt1s4hMUdUWZ7U0PVdUlDB6SDKjhyQz9+xcVJWSPYdZ4TWpvbW5jL+sC2SMjmswJ87Igf0sY7QxvUBrnuS/GJihqo+r6uPATOASf4tluhsRYeSgJK6bPJyHrj2DVf91Pv/4v+ey4AtjOWdkBu9s388P/vI+Fz6wnAn3LOXG3xfz+D+38v6uCmrrbPYH0zqBdP3t8cADD3D06NEOLlHHmDZtWrvnY3nhhRfYuHFjm8914MABrrzySkaNGsXo0aN5++2323X9E2ltE1kKUO6979/hpTA9jogwYkA/Rgzox9UTs1FVSvcfC876uXJrGS+/7zJGJwcyRns1nNMsY7Rphs0H01h754O55ZZbmDlzJosWLeL48eO+BN/WBJgfA++IyKvUjyJrVfOYiMwEHgSigcdUdUHY9rnAfcBOb9VDqvqYt+1e6mtKd6vqQm99LvAskAasBa5T1eMnOpeJPBEJZoz+t8IsAHYdOOYSeHrP4rziZYzuF9eHCcNTgwGnILM/MRZd5HvfAAAf6UlEQVRwupx7V93Lv8r/1aHnHJU2itsm3tbsdpsPpmPmgzl48CDLly/nt7/9LeCySMfGdvwD1q0ZRfaMN0T5TFyAuY1WNK2JSDTwMO6BzFJgtYgsVtWNYbsuVNX5YcdeApwBjAPigNdF5G+qehC4F/ipqj4rIr8EvgI80ty5TNc1NCUsY/TBymDtZuWWcn7yd5cxum9MNBOGpwYzDYzLTiGuj2WM7o1sPpiOmQ9my5YtDBgwgOuvv57169czYcIEHnzwwWBetY7SqiYyVf0EWBxYFpHtQHYLh00ESlR1i3fMs8BlQHiAacoY4HUve0CNiKwHZorIc8B5wLXefk8C/0N9gDHd2MDkeD7/maF8/jMujXjZ4SpWbysPTjX902UfoQqxfaIYn5XCpBHpTM5NY3x2Kn1jLeB0thPVNDqDzQfT/vlgampqWLt2LT//+c+ZNGkSt9xyCwsWLODuu+9u9WfVGu1Nq9uaIUDDgB0hy6XApCb2u0JEpgIfAd9S1R3AeuAOEbkfSACm4wJTOnAgkLbGO+ewFs5luqnwjNEHjh5n9bb9waHRD/1jEz9TiIkWPpOZEmxSmzA8lUTLGN3j2Xww7Z8PJjMzk8zMTCZNcl/JV155JQsWdPwEcu1t2G7NsJ+m7j78uBeBHFUtwGUFeBJAVYuAJcBbwDPA20BNC+ds8lyNCiUyT0SKRaR47969rbgN01WkJMQyY8wgvn/pGF78j8+y7o4LeGLumfyfz+ZSq8qvXt/Cvz++ioI7i7js4Tf58ZIP+Me/dnOwsjrSRTcdxOaD6Zj5YAYPHkxWVhYffuiaoV955ZU2DxJojWb/zBORn9N0IBHcqLKWlAJZIcuZhD2gqaplIYu/xvWvBLb9EPihV5angU3APiBFRPp4tZjgOU90rrBrPgo8Ci5dfyvuw3RRyfExTB81kOmjXMboI1U1rN1eP0XBE29u41fLtxAlMGaoyxg9KTeNiblppCRYxujuyOaD6Zj5YMA1533pS1/i+PHjjBgxgieeeKLdn0lzmp0PRkS+fKIDVbXJGkLI8X1wTVXn40Z2rQauVdX3Q/YZ4vXvICKzgdtUdbI3QCBFVctEpAB4GhinqjVeP8yfQjr5N6jqL5o714nK2JPngzEuY3RowHln+wGqauoAGDU4yXv402UbyOhnGaNbw+aDiZweNR9MUwFERAar6qetKZQXDOYDL+OGKT+uqu+LyF24ycoW47ICzMI1f5UDc73DY4A3vDbGg8CckH6X24BnReQe4B3gN9765s5leqn4mGim5GUwJc/9QoZnjP5jcSlPehmj8wf2CwacyblpDLSM0cactBZntGyws8haVT3Dx/J0KqvB9G7VtXW8u7MiWMMp3rafw1Xu75jcjMRgc9qkEekMS+kb4dJ2DT2lBtMd54OJlJOpwbQ1wLyjquPbXsSuyQKMCVVTW8fGTw6yaqsbGr16WzkVx9wAgczUvsHpCSbnppOV1rdXJvDsKQHGtJ7fUyaH+nUb9zem2+gTHUVBZgoFmSnBjNH/+vRQ8MHPVz/cw5/WuikKhvSPb9CHMyKj92SMVtVec6+9XVsqIE1pU4BR1fZlmTOmG4qKEsYMTWbM0GSu9zJGb9pzONiH8+bmMl7wMkYPSIpjYm4ak72gM3Jgvx75JRwfH09ZWRnp6ek98v5MPVWlrKyswXM+bdWmJrKexprIzMlQVbbuOxKc9XPl1nI+qagEIC0xlokhCTxHDU7qEVMUVFdXU1paSmVlZaSLYjpBfHw8mZmZxMTENFjvSx9MT2MBxnQkVWVH+TFWeE1qK7eWUbrfJTFMju/j5VJz/ThjhljGaNN9+dUHY4xphoiQnZ5AdnoCX/QyRu88cIxVwYBTzrIP6jNGF+akBgPO2GGWMdr0PFaDsRqM6US7AxmjvSa1kj0uzUlCrMsYHRg4UJDZv9UZo1UVVahTRSH4Hrx16lJyBN4Tsm/9du/fBuepX6coderWufnhAtf0ttU1PEfo/g3OBdTV1V+bsLIFrh0sY9h2DbvHhucOlCP03IFy1L9HG5Yt+D7kc6jT0PtpZl0Tn29z5aaJe2x47rB11H/Wje6nruF9EfZ/E/6ZaGiZQtZdNn4Y100e3q6fY6vBGNMFDUqOZ9ZnhjLLyxi973AVq7e62s2KLWX8b5HLOxUTLcRGRzX6EmvqC8lERpS4WqsAUSIg3joEEbdOwFvfcJ2EHesd7tYJDfYNnDt03yhvgIWIeOUIvZ63LnR7oExRIEQRFQUxndAnaAHGmAjK6BfHRWOHcNHY+ozRq7aW886OAxyvqav/EmvwxeXeR3nfVOFfUoHBBA3WBb+46r/gmvpiO+EXYFNfbNR/wRF8X78uUObwL7qG91N/X4R9OQe20UQ5Gnwh09SXb+g9Bj6vhscGyxTV9BeyNLjHhp+NaZkFGGO6kJSEWC44bTAXnNb0RFXGdCfWq2iMMcYXFmCMMcb4wgKMMcYYX1iAMcYY4wsLMMYYY3xhAcYYY4wvLMAYY4zxhQUYY4wxvrAAY4wxxhcWYIwxxvjC1wAjIjNF5EMRKRGR7zaxfa6I7BWRdd7rhpBt94rIe97rqpD1uSKyUkQ2ichCEYn11sd5yyXe9hw/780YY8yJ+RZgRCQaeBi4CBgDXCMiY5rYdaGqjvNej3nHXgKcAYwDJgG3ikiyt/+9wE9VdSSwH/iKt/4rwH5VzQd+6u1njDEmQvyswUwESlR1i6oeB54FLmvlsWOA11W1RlWPAOuBmeJSmJ4HLPL2exK43Ht/mbeMt/18sZSnxhgTMX4GmGHAjpDlUm9duCtEZIOILBKRLG/deuAiEUkQkQxgOpAFpAMHVLWmiXMGr+dtr/D2b0BE5olIsYgU79279+Tu0BhjTLP8DDBN1R7Cp0d6EchR1QJgGV4NRFWLgCXAW8AzwNtATQvnbM31UNVHVbVQVQsHDBjQmvswxhjTDn4GmFJcrSMgE9gVuoOqlqlqlbf4a2BCyLYfev0yM3DBYxOwD0gRkT5NnDN4PW97f6C8Q+/IGGNMq/kZYFYDI71RX7HA1cDi0B1EZEjI4izgA299tIike+8LgAKgSFUVeBW40jvmy8BfvPeLvWW87f/w9jfGGBMBvs1oqao1IjIfeBmIBh5X1fdF5C6gWFUXAzeLyCxc81c5MNc7PAZ4w+ujPwjMCel3uQ14VkTuAd4BfuOt/w3wexEp8c51tV/3ZowxpmXSm//ILyws1OLi4kgXwxhjuhURWaOqhS3tZ0/yG2OM8YUFGGOMMb6wAGOMMb2FKuz5AN78GWx53ffL+dbJb4wxpguoOgxbl0PJUti0FCq859/PvgVGnOvrpS3AGGNMT6IKZSWwqcgFlI/fhNrjEJMII6bBOf8X8j8HKVktnemkWYAxxpju7vhR2PZPL6gUwYGP3fqMU2HiPBg5A7LPgj5xnVosCzDGGNMdlW12NZSSpS641FRCn76u2WvKf7igkpoT0SJagDHGmO6guhI+/qcLKpuWQvlmtz4tDyZc7wLK8LMhJj6y5QxhAcYYY7qq/dvqA8rW5VBzDPrEQ845MOlG15eSnhfpUjbLAowxxnQVNVXw8Vv1TV/7PnLrU3PgjOsgfwbkfBZiEyJazNayAGOMMZF0YEf9EOItr0P1EYiOdc1dgaav9HzohvMnWoBpjz3/guLfQNYk9+qE4X7GmB6i5jjsWFHf9LX3A7e+fzZ85ioYeYFrAovrF9lydgALMO2x70N45w+w6lG3nDysPthkT4JBYyHaPlpjjOfgrvpmr82vwfFDEBUDw8+C8V9yTV8DTu2WtZQTsW/B9hhzGZx6Cex+F3asgu0rYMdKeP/PbntMAgyb4AWcyZBZCH1TI1tmY0znqa2B0lXecynL3HcFuD9GT/+Cq6WMOBfikiJbTp9Zuv6OTNdfUeoFm1WuCvzpe6C1btuA0a52E6jppI3ocX+tGNOrHdoNJctcUNn8KlRVgES7BxxHfs4FlYFjesTvfWvT9VuA8XM+mKrDsHONq93sWAk7VrsfOoDEAfXBJmsSDB3X6U/ZGmNOQl0tlBa7gFKyFD5Z79b3G1wfUEZMg/j+kSylL1obYKyJzE9x/Vw1OJBQrq7OdejtWAnbvaDzr5fctuhYGDq+vlktaxIkZkSu7MaYxg7vhc2veLWUf8Cx/SBRkDkRzvtvF1QGj+0RtZSOYDWYSM9oeWh3SA1nJexaB3XVbltaXv3AgazJkHEKRNkMC8Z0mrpa2PWON+KryL1HXQtE/gxXUxkxHRLSIl3STmVNZK3QJQJMuOpK90O8I9CXsxKOlrlt8SmQNdF7TXYDCbrJA1fGdBtHy6HkFdfsVbLM+/0TN1hn5AXuuZTBn+nVf+x1iSYyEZkJPAhEA4+p6oKw7XOB+4Cd3qqHVPUxb9tPgEtwk6ItBW5RVRWRq4Dveef8q6p+p6VzdSsx8W7o4vCz3LKqS2q3Y0V909qmIrctqo+rjmdNdkEnezIkD41c2Y3pjurq4NP19bWUnWtA6yAhHfLOd0El7zxITI90Sbsd3wKMiEQDDwMzgFJgtYgsVtWNYbsuVNX5YcdOAc4GCrxV/wTOFZF3cUFkgqruFZEnReR8VX2luXN1eyKQke9e4+e4dUfLoXR1/Yi1Nb+FlY+4bf2zQvpxJsLA0+yZHGPCHdvv+lA2LXM1lSN73fqhZ8DU77haytDxEBUd2XJ2c35+80wESlR1C4CIPAtcBoQHmKYoEA/EAgLEALuBEcBHqur9NLAMuAJ4pamT9FgJaXDKhe4F7sngT9/1+nFWuNTd7y1y22L7uap9YLRaZmGPHNVizAmput+RTUWu2WvHSldLiU+B/EAt5XzoNyDSJe1R/Awww4AdIculwKQm9rtCRKYCHwHfUtUdqvq2iLwKfIILMA+p6gcikgqMEpEc73yX44JQs+fq6JvqkvrEQuYE9zrrJvfLdGB7/fM421fC8vvcLxQCg06r78fJngQpw23Ui+l5Kitgy2v1Dzse/tStH/IZ+Ox/uqAybILV8H3k5yfb1DdW+IiCF4FnVLVKRL4GPAmcJyL5wGgg09tvqYhMVdXlIvJ1YCFQB7yFq9U0e65GhRKZB8wDyM7OPqkb7LJEIHW4exX8m1tXeRB2FtdnHtjwHBQ/7rb1GxSS6mYyDC5wQcuY7kQV9mysDyg7VkBdDcT1h7zprtkr/3OQNDjSJe01fBtFJiJnAf+jqhd6y7cDqOqPm9k/GihX1f4icisQr6p3e9t+AFSq6k/CjpkH5Ac6+ps614nK2CVHkXWWulr3yxiaeeDAdretT7xriw7NPNDLhmGabqLqkMtAHGj6OuiN8Rl0ugsoIy+AzDMhOiay5exhusIostXASBHJxY3suhq4NnQHERmiqp94i7MAL60o24GvisiPcTWhc4EHvGMGquoer7nsJuCLLZzLNCUq2o1AGzwWJn7VrTv4ScNnct76OdT91G1LH1n/PE7WJMgYac1qpvOpwt4PvfT2RfDx2+65sdgkyJsG597main9h0W6pAYfA4yq1ojIfOBl3JDix1X1fRG5CyhW1cXAzSIyC6gByoG53uGLcM1b7+Ka1f6uqi962x4Ukc947+9SVW9GnmbPZVoreQicdrl7ARw/Wv9MzvaV8MFLLos0QN80rx/Ha1YbOh5i+kau7KbnOn7EzeYYSG9f4dW0B4yGyV93NZWsydas2wXZg5a9tYmsPerqoGxTSKqbFVBW4rZFxbjO09DMA0mDIlte0z0Fnv0K5Pja9k+oPQ4xiS7t0sgZ7il6m4cpYuxJ/lawANMBjpQ1bFbbuRZqq9y2lOH1z+NkTYaBo+25AtO06mMukGwqcq/929z6jFNcP0r+52D4FEsI20VYgGkFCzA+qKmCTzY0zDxwZI/bFpfsPZPjBZ3Mwh4/H4Y5gfIt9c1e296Amkro0xdyp3od9DPcXPSmy7EA0woWYDqBKuzfGjIx2yo3eg11WWgHnd4w80D/LBs80FNVV8LHb9bP7BhoXk3Lqw8owz/r0iWZLs0CTCtYgImQYwfcMzmBfpzSNVB9xG1LGlqfVy1rkhvlZkNMu6/9H3sjvpa6jvrqoxAdB7nneNmIZ0B6XqRLadqoKwxTNqZpfVNcm3r+59xybQ3sfq9h5oGNL7htwemnvX6crDNt+umurOY4bH+rvulr34dufcpwGPcl15+S81nLAt5LWA3GajBdU0WpN3DAa1r79N2Q6adHNcw8YNNPR1ZFaX1A2fo6HD/sJtAbfnb9w47p+fZ/1INYDcZ0b/0z3ev0K9zy8SMujXpgJtD3X4C1T7ptCRkhw6MnwZBx1o7vp9pqF/QDTV97vPy1/bOg4Iuu6St3qpvR1fRqFmBM9xCb6L60cqe65bo61/yyfUX9EOkP/+q2Rce6IBOaecCy5J6cg5/UB5Qtr0HVQTcfUfZZMONuV1MZMMpqKaYBayKzJrKe4/Cehv04n6xzD+iBa0YLbVbLOLVXz0jYotoaN+dQ4GHHT99165OG1o/4yj0X4pMjW04TETaKrBUswPRw1ZUuyAQzD6yEo/vctvj+kDmxvmlt2ARXS+rNDu12CSNLlrrJuCorQKJdQA48PT/oNKulGOuDMYaYePflmD3ZzY+q6h7uC21WK1nq9hUv+Wdo5oGenjCxrtb1a20qck1fn6xz6/sNglGfd0FlxDQ36s+YdrAajNVgerdj+2HHai/zwCooLYaaY25b/6yQ4dET3UOh3X1yqiP7oOQVF1Q2v+LuX6JcbW7k59yIr0FjrfnQnJDVYIxpjb6pcMoF7gVuhFRg+untK+Djt+C9P7ltMYlu1tDATKCZZ3b96afr6lxG7EB6+51rAXUj706Z6dVSptt8P8YXVoOxGow5EVWo2BGS6mYF7H6/fvrpgWMaZh5IzYl8H8XRcteHsmmp61M5us+VNbOw/un5IeOslmLazWowxnQEEUjJdq+xV7p1VYdcU1pgxNq7i2DNE25b4sCQmUAnw5AC/zMA19XBpxu8hx2LXBoerXNz9uR/zgWUvPMhMd3fchgTxgKMMW0Vl+TmeM+b7pbramHPB/X9ONtXwAfe/HjRcTDsjPoh0lmTOuaL/tgBV0spWeYCSyBj9dDxMPVW15cydLxNj2AiyprIrInM+OHQpw2HR3+y3k3tCy5tSqAfJ2uSm466peYqVZevbVMRbFrmzqm1EJ8Ceed5c6acD/0G+n9vptez52BawQKM6TTVx1xne2DKgh0r4Vi529Y31Y3iCmQeGDreJYOsPOiemt9U5Goqhz5x+w8ucAFl5AwYVtj9R7aZbsf6YIzpSmL6uhkZh09xy6qwz5t+OpB5YNPLbltUH1fLKSuBuho3UVve9PqZHZMGR+4+jGkDXwOMiMwEHgSigcdUdUHY9rnAfcBOb9VDqvqYt+0nwCVAFLAUuEVVVUSuAr7nnfOvqvodb/844HfABKAMuEpVt/l5f8a0mwgMOMW9zrjOrTtSBqVe7ebT97xhxBe4UWo2J47phnwLMCISDTwMzABKgdUislhVN4btulBV54cdOwX37HWBt+qfwLki8i4uIE1Q1b0i8qSInK+qrwBfAfarar6IXA3cC1zl1/0Z0+ES0+HUi9zLmB7Az4HwE4ESVd2iqseBZ4HLWnmsAvFALBAHxAC7gRHAR6q619tvGeDlc+cywMvfziLgfJFIP5BgjDG9l58BZhiwI2S51FsX7goR2SAii0QkC0BV3wZeBT7xXi+r6gdACTBKRHJEpA9wOZAVfj1VrQEqABv4b4wxEeJngGmq9hA+ZO1FIEdVC3C1kScBRCQfGA1k4gLHeSIyVVX3A18HFgJvANuAmjZcDxGZJyLFIlK8d+/eJg4xxhjTEfwMMKXU1y7ABYtdoTuoapmqVnmLv8Z10APMBlao6mFVPQz8DZjsHfOiqk5S1bOAD4FN4dfzajf9gfLwQqnqo6paqKqFAwbYJFTGGOMXPwPMamCkiOSKSCxwNbA4dAcRGRKyOAv4wHu/Hdep30dEYoBzA9tEZKD3bypwE/CYd8xi4Mve+yuBf2hvfsjHGGMizLdRZKpaIyLzgZdxQ4ofV9X3ReQuoFhVFwM3i8gsXDNXOTDXO3wRcB7wLq6Z6++q6uXe4EER+Yz3/i5V/ch7/xvg9yJS4p3rar/uzRhjTMvsSX57kt8YY9qktU/yW75uY4wxvujVNRgR2Qt83M7DM4B9HVicjtJVywVdt2xWrraxcrVNTyzXcFVtcZRUrw4wJ0NEiltTRexsXbVc0HXLZuVqGytX2/TmclkTmTHGGF9YgDHGGOMLCzDt92ikC9CMrlou6Lpls3K1jZWrbXptuawPxhhjjC+sBmOMMcYXFmCaISLRIvKOiLzUxLY4EVkoIiUislJEckK23e6t/1BELuzkcv2niGz0slO/IiLDQ7bVisg677U4/FifyzVXRPaGXP+GkG1fFpFN3uvL4cf6XK6fhpTpIxE5ELLNt89LRLaJyLveuRs96SvOz7yfow0ickbINt8+r1aU60teeTaIyFshGTVaPNbnck0TkYqQ/68fhGyb6f0ulojIdzu5XLeGlOk972cqrTXHnmS5UsRlp/+XiHwgImeFbe+8ny9VtVcTL+A/gaeBl5rYdhPwS+/91bhJ0wDGAOtxc9jkApuB6E4s13QgwXv/9UC5vOXDEfy85uJmKw1fnwZs8f5N9d6ndla5wvb7D1w6I98/L1wW8IwTbL8Yl+BVcEleV3bG59WKck0JXA+4KFCu1hzrc7mmNfNzF+39Do7AzS21HhjTWeUK2/fzuPyInfF5PQnc4L2PBVIi9fNlNZgmiEgmbrrmx5rZpbnJzS4DnlXVKlXdipu/ZmJnlUtVX1XVo97iClwGa9+14vNqzoXAUlUtVzcVw1JgZoTKdQ3wTEdd+yRdBvxOnRVAirjEsL5+Xi1R1be860In/nydhJOZ9LCjdcrPl4gkA1NxuRlR1eOqeiBst077+bIA07QHgO8Adc1sb25ys9ZOsuZXuUJ9BfdXSkC8uHlwVojI5R1YptaWq9HEcnSRz8trSswF/hGy2s/PS4EiEVkjIvOa2N7c5+L359VSuUKF/3y15Vg/ynWWiKwXkb+JyGneui7xeYlIAu6L+k9tPbYdRgB7gSe8puHHRCQxbJ9O+/nyLZtydyUilwJ7VHWNiExrbrcm1ukJ1ndWuQL7zgEKcdMcBGSr6i4RGQH8Q0TeVdXNnVSuF4FnVLVKRL6Gq/2dRxf5vHDNnItUtTZknS+fl+ds79wDgaUi8i9VXR5a/CaO8fXnq5XlcoUTmY4LMJ9t67E+lWstLnXJYRG5GHgBGEkX+bxwzWNvqmp5O45tqz7AGcB/qOpKEXkQ+C7w3yH7dNrPl9VgGjsbmCUi23BV6vNE5A9h+zQ3uVmLk6z5XC5E5HPA94BZWj+ZG6q6y/t3C/AaML6zyqXNTywX8c/LczVhzRc+fl6h594DPE/jZtTmPhc/P6/WlAsRKcA1OV6mqmVtOdavcqnqQXUTE6KqS4AYEcmgC3xenhP9fHX051UKlKrqSm95ES7ghO/TOT9ffnQy9ZQXzXcefoOGnfx/9N6fRsNO/i10cCd/C+Uaj+vUHBm2PhWI895n4GYB7bDOzlaUa0jI+8BspeA6E7d65Uv13qd1Vrm8bafiOlylMz4vIBFICnn/FjAzbJ9LaNgJu8rvz6uV5crG9StOaeuxPpdrcOD/D/dFvd377Pp4v4O51Hfyn9ZZ5fK2Bf74TOyMz8s75xvAqd77/wHui9TPlzWRtZI0nCitycnN1E2o9kdgI24StW9ow2YXv8t1H9APeM6NOWC7qs4CRgO/EpE6XK11gapu7MRyNTmxnKqWi8jduNlPwU0g12iaax/LBa7z9Vn1fsM8fn5eg4Dnvf+fPsDTqvp3r+kQVf0lsAQ30qcEOApc723z8/NqTbl+gOtr/IW3X426ZIlNHtuJ5boS+LqI1ADHgKu9/88mJz3sxHKB+4OqSFWPtHRsB5UL3IjIp8TNJLwFuD5SP1/2JL8xxhhfWB+MMcYYX1iAMcYY4wsLMMYYY3xhAcYYY4wvLMAYY4zxhQUYY4wxvrAAY0w3IC69e0Y7j50rIkM74lzGtIUFGGN6vrnA0JZ2MqajWYAxpg1EJEfcRE6PiZtE6ikR+ZyIvOlN0jTRe73lZbN9S0RO9Y79TxF53Hs/1js+oZnrpItIkXeOXxGSiFBE5ojIKnGTVf1KRKK99YdF5P+JyFpxE84NEJErcYlPn/L27+ud5j+8/d4VkVF+fmam97IAY0zb5QMPAgXAKOBaXGbhbwP/BfwLmKqq43HpVX7kHfcAkC8is4EngBu1fv6ecHcA//TOsRiXBwwRGQ1chcvGOw6oBb7kHZMIrFXVM4DXgTtUdRFQDHxJVcep6jFv333efo945Tamw1kuMmPabquqvgsgIu8Dr6iqisi7QA4uweGTIjISl+48BkBV60RkLrAB+JWqvnmCa0wFvuAd91cRCUz0dT4uG/VqL5dVX2CPt60OWOi9/wPw5xOcP7BtTeA6xnQ0CzDGtF1VyPu6kOU63O/U3cCrqjpbRHJw6f4DRgKHaV2fSFOJAgV4UlVvb+fxAYEy12LfA8Yn1kRmTMfrD+z03s8NrBSR/rimtalAutc/0pzleE1fInIRLn06wCvAld5EVYhImrgZOcH9PgfOeS3wT+/9ISDpJO7HmHaxAGNMx/sJ8GMReROXJj7gp8AvVPUj3IyQCwKBogl3AlNFZC1wAW6OE7xpA76Pm253A27e9CHeMUeA00RkDW7G0Lu89b8FfhnWyW+M7yxdvzE9hIgcVtV+kS6HMQFWgzHGGOMLq8EYE0Eicj1wS9jqN1X1G5EojzEdyQKMMcYYX1gTmTHGGF9YgDHGGOMLCzDGGGN8YQHGGGOMLyzAGGOM8cX/B6dSCFNxR1/mAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x26cd4a9a208>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(\"Best: %f using %s\" % (GSearch_3.best_score_, GSearch_3.best_params_))\n",
    "test_means = GSearch_3.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = GSearch_3.cv_results_[ 'std_test_score' ]\n",
    "train_means = GSearch_3.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = GSearch_3.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "pd.DataFrame(GSearch_3.cv_results_).to_csv('my_preds_maxdepth_min_child_weights_3.csv')\n",
    "\n",
    "# plot results\n",
    "test_scores = np.array(test_means).reshape(len(max_depth), len(min_child_weight))\n",
    "train_scores = np.array(train_means).reshape(len(max_depth), len(min_child_weight))\n",
    "\n",
    "for i, value in enumerate(max_depth):\n",
    "    pyplot.plot(min_child_weight, -test_scores[i], label= 'test_max_depth:'   + str(value))\n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'max_depth' )                                                                                                      \n",
    "pyplot.ylabel( '-Log Loss' )\n",
    "pyplot.savefig('max_depth_vs_min_child_weght_3.png' )"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
